<?php
namespace Monkey\Database\Driver;

define('FETCH_ASSOC', 'assoc');
define('FETCH_NUM', 'num');
define('FETCH_BOTH', 'both');
define('JOIN_LEFT', 'LEFT');
define('JOIN_RIGHT', 'RIGHT');
define('JOIN_FULL', 'FULL');
define('JOIN_INNER', 'INNER');

/**
 * 数据库驱动接口\Monkey\Database\Driver\_Interface
 * @package    Monkey\Database\Driver
 * @author     HuangYi
 * @copyright  Copyright (c) 2011-07-01——2013-03-30
 * @license    New BSD License
 * @version    $Id: \Monkey\Database\Driver\_Interface.php 版本号 2013-03-30 $
 */
interface _Interface {
    /**
     * 构造方法
     * @param array $config 数据库连接配置
     */
    public function __construct($config);
    /**
     * 连接数据库
     * 测试模式下，返回测试通知（格式见通用通知格式）；
     * 非测试模式下，失败抛出异常，连接成功将把获得的资源作为驱动的连接资源。
     * @param array $config 连接参数
     * @param bool $isTest=false 是否为测试模式
     * @return mixed
     */
    public function connect($config,$isTest=false);
    /**
     * 对sql参数中的特殊字符进行转义
     * @param string|array $data 待转义的数据
     * @return string|array
     */
    public function escape($data);
    /**
     * 获取连接的表前缀
     * @return string
     */
    public function getPreFix();
    /**
     * 事务
     * @param string|int $type 事务操作名 begin|0：开始事务、 commit|1：提交事务、 rollback|-1：回滚事务
     * @return $this
     */
    public function transaction($type);
    /**
     * 查询方法
     * @param string $sql 查询语句
     * @return \Monkey\Database\Driver\_Interface
     */
    public function query($sql);
    /**
     * 查询方法判断查询是否成功
     * @return bool
     */
    public function isSuccess();
    /**
     * 读取所有记录为数组
     * @param string $model=FETCH_ASSOC 读取模式 assoc|num|both 默认为assoc
     * @return array
     */
    public function resultAll($model=FETCH_ASSOC);
    /**
     * 读取一条记录为数组
     * @param string $model 读取模式 assoc|num|both 默认为assoc
     * @return array
     */
    public function result($model=FETCH_ASSOC);
    /**
     * 读取记录集中的行数
     * @return integer
     */
    public function resultCount();
    /**
     * 读取受影响的行数
     * @return integer
     */
    public function affectedRows();
    /**
     * 读取最后插入行的id
     * @return integer
     */
    public function insertId();
    /**
     * 读取错误代号
     * @return integer
     */
    public function errorCode();
    /**
     * 读取错误信息
     * @return string
     */
    public function errorMessage();
    /**
     * 获取查询的真实sql语句
     * @return string
     */
    public  function lastSql();
    /**
     * 清理查询痕迹
     * @return $this
     */
    public  function clear();
    /**
     * 销毁连接
     * @return mixed
     */
    public function destroy();
}

/***********sql防注************/
/**
 * sql防注入编码函数
 * @param string $string
 * @return mixed
 */
function sql_encode($string){
    static $attack='(\'|\b)(and|or)\b.+?(=|>|<|\bin\b|\blike\b)|\/\*.+?\*\/|<\s*script\b|\bEXEC\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\s+(TABLE|DATABASE)';
    return preg_replace_callback($attack,
        create_function(
            '$matches',
            'return str_replace('
                .'array("&","<",">","#","(",")","[","]",",","\n","--"," ")'
                .','
                .'array("&#amp;","&#lt;","&#gt;","&#23;","&#28;","&#29;","&#5B;","&#5D;","&#2C;","&#0A;","&#-#;","&#20;")'
                .',$matches[0]);'
        )
        ,$string);
}
/**
 * sql防注入解码函数
 * @param mixed $data
 * @return mixed
 */
function sql_decode($data){
    static $source=array('&',      '<',     '>',     '#',      '(',     ')',     '[',     ']',     ',',     "\n",   '--',   ' ');
    static $encode=array('&#amp;', '&#lt;', '&#gt;', '&#23;', '&#28;', '&#29;', '&#5B;', '&#5D;', '&#2C;', '&#0A;','&#-#;', '&#20;');
    if (is_array($data)) return array_map('sql_decode', $data);
    if (!is_string($data)) return $data;
    return str_replace($encode,$source,$data);
}